package com.hsp_java.map_;

import java.util.Collection;
import java.util.Comparator;
import java.util.TreeMap;

@SuppressWarnings({"all"})
public class TreeMap_ {
    public static void main(String[] args) {
        //使用默认的构造器 创建TreeMap ， 是无序的
        /*
            要求： 按照传入的 k(String) 的大小进行排序
            1. 构造器， 把传入的实现了Comparator 接口的匿名内部类赋给了属性
            public TreeMap(Comparator<? super K> comparator) {
                this.comparator = comparator;
            }
            2. 调用put方法

            2.1 第一次添加, 把 k-v 封装到 Entry对象， 放入root
            Entry<K,V> parent;
            // split comparator and comparable paths
            Comparator<? super K> cpr = comparator;
            if (cpr != null) {
                do {
                    parent = t;
                    cmp = cpr.compare(key, t.key);
                    if (cmp < 0)
                        t = t.left;
                    else if (cmp > 0)
                        t = t.right;
                    else
                        return t.setValue(value);
                } while (t != null);
            }
            2.2  以后添加

            Entry<K,V> parent;
            // split comparator and comparable paths
            Comparator<? super K> cpr = comparator;
            if (cpr != null) {//遍历所有key, 给当前key找到适当位置
                do {
                    parent = t;
                    cmp = cpr.compare(key, t.key);
                    if (cmp < 0)
                        t = t.left;
                    else if (cmp > 0)
                        t = t.right;
                    else //如果遍历过程中， 发现准备添加Key 和当前已有的Key 相等， 就不添加
                        return t.setValue(value);
                } while (t != null);
            }
         */
        //TreeMap treeMap = new TreeMap();
        TreeMap treeMap = new TreeMap(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                //按照传入的 k(String) 大小来排序
                //按照K(String)的大小进行排序
                //
                //return ((String)o1).compareTo((String)o2);
                return ((String)o1).length() - ((String)o2).length();
            }
        });
        treeMap.put("Jack", "杰克");
        treeMap.put("Roll", "罗洛");
        treeMap.put("Tomac", "托马西");
        treeMap.put("Exily", "艾斯力");

        System.out.println("treemap= " + treeMap);
    }
}
